/**
 * 
 */
package com.question.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 说明：无论是接收Runnable型参数，还是接收Callable型参数的submit()方法，都会返回一个Future（也是一
个接口）类型的对象。该对象中包含了任务的执行情况以及结果。调用Future的boolean isDone()方法
可以获知任务是否执行完毕；调用Object get()方法可以获得任务执行后的返回结果，如果此时任务还
没有执行完，get()方法会保持等待，直到相应的任务执行完毕后，才会将结果返回。
 * 
 * @data 2012-10-30 下午03:38:18
 * @author nassir wen
 */
public class ExecutorTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService es = Executors.newSingleThreadExecutor();
        
        Future fr = es.submit(new RunnableTest());// 提交任务
        Future fc = es.submit(new CallableTest());// 提交任务
        // 取得返回值并输出
        System.out.println((String) fc.get());
        
        System.out.println((String) fr.get());
        // 检查任务是否执行完毕
        if (fr.isDone()) {
            System.out.println("执行完毕-RunnableTest.run()");
        } else {
            System.out.println("未执行完-RunnableTest.run()");
        }
        // 检查任务是否执行完毕
        if (fc.isDone()) {
            System.out.println("执行完毕-CallableTest.run()");
        } else {
            System.out.println("未执行完-CallableTest.run()");
        }
        // 停止线程池服务
        es.shutdown();
    }
}

class RunnableTest implements Runnable {
    public void run() {
        System.out.println("已经执行-RunnableTest.run()");
        try {
            Thread.sleep(1000*5);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

class CallableTest implements Callable {
    public Object call() {
        System.out.println("已经执行-CallableTest.call()");
        try {
            Thread.sleep(1000*5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "返回值-CallableTest.call()";
    }
}
